package org.xmap.ui;

import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

import org.xmap.app.Env;
import org.xmap.ui.control.Label;
import org.xmap.ui.control.Menu;

/**
 * <p>皮肤类，可以通过构造该类的对象或修改静态对象的值来达到修改皮肤的功能。</p>
 * @author Zealot
 * @version 1.0
 */
public final class Theme {

    /**
     * 全局皮肤实例。
     */
    public static final Theme instance = new Theme();

    // 视图=====================================================================
    /**
     * 视图的背景颜色，默认为0xffff88。
     */
    public int viewBackgroundColor = 0xffff88;
    /**
     * 默认的边框颜色。
     */
    public int defaultLineColor = 0xb67544;
    /**
     * 默认的被选中的颜色。
     */
    public int defaultSelectedColor = 0xff9e0c;

    // 标题栏====================================================================
    /**
     * 默认显示标题。
     */
    public boolean showTitle = true;
    /**
     * 标题栏的高度，默认为20个像素。
     */
    public int titleHeight = 20;
    /**
     * 标题的背景颜色，默认为白色。
     */
    public int titleBackgroundColor = 0xffffff;
    /**
     * 标题栏的字体的颜色，默认为黑色。
     */
    public int titleTextColor = 0x0;
    /**
     * 标题栏的背景图像。
     */
    public Image titleBackground;
    /**
     * 标题栏文字的绘制方式，默认为居中。
     */
    public int titleAlign = Label.ALIGN_CENTER;
    /**
     * 标题栏文字的横向偏移，默认为0。
     */
    public int titleOffset = 0;

    // 菜单栏====================================================================
    /**
     * 菜单栏的高度，默认为20个像素。
     */
    public int menubarHeight = 20;
    /**
     * 菜单的背景颜色，默认为白色。
     */
    public int menubarBackgroundColor = 0xffffff;
    /**
     * 菜单栏的字体的颜色，默认为黑色。
     */
    public int menubarTextColor = 0x0;
    /**
     * 菜单栏的背景图像。
     */
    public Image menubarBackground;
    /**
     * 子菜单背景颜色。
     */
    public int submenuBackgroundColor = 0xffffff;
    /**
     * 子菜单文字颜色。
     */
    public int submenuTextColor = 0x0;
    /**
     * 子菜单文字聚焦颜色。
     */
    public int submenuFocusedTextColor = 0x0;
    /**
     * 子菜单被选中的背景颜色，默认为0xFFFCA432。
     */
    public int submenuFocusedBackgroundColor = 0xfca432;
    /**
     * 默认的子菜单宽度，默认为60个像素，当子菜单里面的菜单项文字太长，将会自动拉伸。
     */
    public int defaultMenuWidth = 60;
    /**
     * 子菜单左上角的图像。
     */
    public Image submenuCornerLU;
    /**
     * 子菜单右上角的图像。
     */
    public Image submenuCornerRU;
    /**
     * 子菜单左下角的图像。
     */
    public Image submenuCornerLD;
    /**
     * 子菜单右下角的图像。
     */
    public Image submenuCornerRD;
    /**
     * 子菜单顶部的图像。
     */
    public Image submenuTop;
    /**
     * 子菜单底部的图像。
     */
    public Image submenuBottom;
    /**
     * 子菜单左侧的图像。
     */
    public Image submenuLeft;
    /**
     * 子菜单右侧的图像。
     */
    public Image submenuRight;
    /**
     * 表明子菜单下还有子菜单的图像。
     */
    public Image submenuMore;
    /**
     * 非模态滚动圈的颜色。
     */
    public int modelessGuageColor = 0xfc7932;
    /**
     * 非模态滚动圈的alpha边界值。
     */
    public int modelessGuageAlphaAdjust = 0;
    /**
     * 是否显示时间。
     */
    public boolean showTime = true;

    // 消息框====================================================================
    /**
     * 消息框的行高，默认为20个像素。
     */
    public int msgBoxRowHeight = 20;
    /**
     * 消息框的背景颜色，默认为0x78cdf6。
     */
    public int msgBoxBgColor = 0x78cdf6;
    /**
     * 消息框的文字的颜色，默认为黑色。
     */
    public int msgBoxTextColor = 0x0;
    /**
     * 消息框的线框的颜色，默认为黑色。
     */
    public int msgBoxLineColor = 0x0;
    /**
     * 消息框高亮文字的颜色，默认为0xff0000。
     */
    public int msgBoxHightLightColor = 0xff0000;

    // 滚动条====================================================================
    /**
     * 消息框的下方和滚动条的上方在屏幕上的位置占整个屏幕纵方向的百分比，默认为60%。
     */
    public int guageYPercent = 60;
    /**
     * 消息框和滚动条的宽度占整个屏幕横方向的百分比，默认为80%。
     */
    public int guageWidthPercent = 80;
    /**
     * 滚动条的高度，默认为11个像素。
     */
    public int guageHeight = 11;
    /**
     * 滚动条的背景颜色，默认为黑色。
     */
    public int guageBgColor = 0x0;
    /**
     * 滚动条的颜色，默认为0xd0fc38。
     */
    public int guageColor = 0xd0fc38;

    // 浏览器控件==================================================================
    /**
     * 浏览器滚动条背景颜色。
     */
    public int explorerStrollbarBackgroundColor = 0x0;
    /**
     * 浏览器滚动条颜色。
     */
    public int explorerStrollbarColor = 0xfca432;

    // 输入框控件==================================================================
    /**
     * 输入框拥有焦点时候的背景颜色值。
     */
    public int textfieldFocusBgColor = 0xff9e0c;

    // 设置框控件==================================================================
    /**
     * 选择框背景颜色。
     */
    public int choiceboxBackgroundColor = 0xffffff;
    /**
     * 选择框文字颜色。
     */
    public int choiceboxTextColor = 0x0;
    /**
     * 选择框背景聚焦颜色。
     */
    public int choiceboxFocusedBackgroundColor = 0xffffff;
    /**
     * 选择框文字聚焦颜色。
     */
    public int choiceboxFocusedTextColor = 0xfca432;
    /**
     * 选择框的左右方向的图片。
     */
    public Image choiceBoxArrow;

    // 列表控件==================================================================
    /**
     * 列表控件的背景图片。
     */
    public Image listBackgroundImage;
    /**
     * 列表控件的线条颜色。
     */
    public int listLineColor = defaultLineColor;
    /**
     * 列表控件的选中项的背景颜色。
     */
    public int listSelectedBackgroundColor = defaultSelectedColor;
    /**
     * 列表控件的文字颜色。
     */
    public int listTextColor = 0xff000000;
    /**
     * 列表控件项被选中的文字颜色。
     */
    public int listHighLightTextColor = 0xffff0000;

    /**
     * 私有的构造函数，不允许生成实例。
     */
    private Theme() {
        try {
            // 读取默认的皮肤图像
            this.titleBackground = Image.createImage("/xmapres/titlebg.png");
            this.menubarBackground = Image.createImage("/xmapres/menubg.png");
            this.submenuCornerLU = Image.createImage("/xmapres/submenucorner.png");
            this.submenuTop = Image.createImage("/xmapres/submenutop.png");
            this.submenuLeft = Image.createImage("/xmapres/submenumiddle.png");
            this.submenuMore = Image.createImage("/xmapres/submenumore.png");
            this.initCornerImage();
            this.initBottomImage();
            this.initRightImage();
            if (this.submenuMore != null) {
                Menu.setMoreIconWidth(this.submenuMore.getWidth());
            } else {
                Menu.setMoreIconWidth(5);
            }
        } catch (Exception e) {
        }
    }

    /**
     * 重新设置字体，并根据新的字体计算变量的值。
     * @param face 新的字体样式。
     * @param style 新的字体样式。
     * @param size 新的字体大小。
     */
    public void setFont(int face, int style, int size) {
        Env.instance.resetFont(Font.getFont(face, style, size));
    }

    /**
     * 设置子菜单的图像，只需要设置左上角、顶部和左侧的图像就可以了，其余的图像可以根据这几张图像计算出来，之所以预先计算出来，是为了提高绘制的效率，是以内存换图像转换时间。
     * @param submenuCornerLU Image 子菜单的左上角的图像。
     * @param submenuTop Image 子菜单的顶部的图像。
     * @param submenuLeft Image 子菜单的左侧的图像。
     * @param submenuMore Image 子菜单的下级菜单的图像。
     */
    public void setSubmenuImage(Image submenuTop, Image submenuLeft, Image submenuCornerLU, Image submenuMore) {
        this.submenuTop = submenuTop;
        this.submenuLeft = submenuLeft;
        this.submenuCornerLU = submenuCornerLU;
        this.submenuMore = submenuMore;
        this.initCornerImage();
        this.initBottomImage();
        this.initRightImage();
        if (this.submenuMore != null) {
            Menu.setMoreIconWidth(this.submenuMore.getWidth());
        } else {
            Menu.setMoreIconWidth(5);
        }
    }

    /**
     * 初始化子菜单的四个角落的图像。
     */
    private void initCornerImage() {
        if (this.submenuCornerLU != null) {
            int w = this.submenuCornerLU.getWidth();
            int h = this.submenuCornerLU.getHeight();
            this.submenuCornerRU = UIUtil.createImage(this.submenuCornerLU, 0, 0, w, h, Sprite.TRANS_MIRROR); // 右上
            this.submenuCornerLD = UIUtil.createImage(this.submenuCornerLU, 0, 0, w, h, Sprite.TRANS_MIRROR_ROT180); // 左下
            this.submenuCornerRD = UIUtil.createImage(this.submenuCornerLU, 0, 0, w, h, Sprite.TRANS_ROT180); // 右下
        }
    }

    /**
     * 初始化子菜单顶部和底部的图像。
     */
    private void initBottomImage() {
        if (this.submenuTop != null) {
            int w = this.submenuTop.getWidth();
            int h = this.submenuTop.getHeight();
            this.submenuBottom = UIUtil.createImage(this.submenuTop, 0, 0, w, h, Sprite.TRANS_MIRROR_ROT180);
        }
    }

    /**
     * 初始化子菜单左侧和右侧的图像。
     */
    private void initRightImage() {
        if (this.submenuLeft != null) {
            int w = this.submenuLeft.getWidth();
            int h = this.submenuLeft.getHeight();
            this.submenuRight = UIUtil.createImage(this.submenuLeft, 0, 0, w, h, Sprite.TRANS_MIRROR);
        }
    }
}
